package com.bangcommunity.bbframe.common.proxy;

import java.util.HashMap;
import java.util.Map;

/**
 * @author tanghc
 * @date 18/1/9
 */
public abstract class DelegateExecutorUtils {
    /**
     * 代理执行方法 执行doBefore,然后执行主方法doExecute。 若有异常执行exception方法 始终都会执行doFinal。
     * 
     * @param executor
     * @param <T>
     * @return
     */
    public static <T> T delegateExecute(DelegateExecutor<T> executor) {
        T t = null;
        Exception exception = null;
        Map<String, Object> context = new HashMap<>();
        try {
            executor.doBefore(context);
            t = executor.doExecute(context);
            return t;
        } catch (Exception e) {
            exception = e;
            if (executor.doException(context, e)) {
                throw e;
            }
        } finally {
            executor.doFinal(context, t, exception);
        }
        return null;
    }
}
